package msghandler

import (
	"fmt"
	"reflect"
	"strings"
	"sync"

	"gitee.com/night-tc/gobige/global"
	"gitee.com/night-tc/gobige/logger"
)

const (
	// MsgProcPrefix 消息处理函数前缀
	MSG_PREFIX = "MsgProc_"
	// RPC处理函数前缀
	RPC_PREFIX = "RPC_"
	// Srv处理函数前缀
	SRV_PREFIX = "Srv_"
)

// GetPreFunc 获取指定前缀处理函数
func GetPreFunc(fix, methodName string, f reflect.Value) (string, reflect.Value, error) {
	if strings.HasPrefix(methodName, fix) {
		return methodName[len(fix):], f, nil
	}
	return "", reflect.ValueOf(nil), fmt.Errorf("")
}

// SetHandlerFunc 设置处理函数到sync.Map中
func SetHandlerFunc(li *sync.Map, methodName string, f reflect.Value) {
	ifuncs, ok := li.Load(methodName)

	var funcs []reflect.Value
	if !ok {
		funcs = make([]reflect.Value, 0, 10)
	} else {
		funcs = ifuncs.([]reflect.Value)
		for _, v := range funcs {
			if logger.CheckKey(logger.LogKey_RegMsgProc) &&
				v.Type().String() == f.Type().String() {
				logger.Warn("重复注册的消息(可能是正确的):", methodName, " ", f.Type().String(), " ", v.Type().String())
			}
		}
	}
	funcs = append(funcs, f)
	li.Store(methodName, funcs)
}

// GetRecover 获取配置中的Recover选项
// 该选项用于决定是否在处理消息时进行错误恢复
func GetRecover() bool {
	if global.GetCfgInst() == nil {
		return false
	}
	return global.GetCfgInst().GetRecover()
}

// getHandlerList 获取指定key的处理函数列表
func getHandlerList(hli *sync.Map, key string) *sync.Map {
	actual, _ := hli.LoadOrStore(key, &sync.Map{})
	return actual.(*sync.Map)
}
